/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

import Modelo.Art;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import org.json.JSONObject;
import org.json.JSONArray;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author Patricia
 */
public class Art_DAO {

    public static boolean insertarArt(Art art) {
        ConexionBD conexion = new ConexionBD();
        PreparedStatement s = null;

        String[] riesgos = art.getFactoresRiesgo();
        String factoresRiesgo = "";
        for (int i = 0; i < riesgos.length; i++) {
            factoresRiesgo += riesgos[i] + "\n";
        }


        String query = "BEGIN TRANSACTION; INSERT INTO art(nombre_puesto,nombre_cargo,sede, realizado_por,"
                + " fecha_art, fecha_modificacion, descripcion, factores_riesgo,"
                + " actividades, observaciones,"
                + " sustancias_materiales_encontrados, equipo_requerido) VALUES"
                + " (?,?,?,?, to_date(?, 'dd/mm/yyyy'),to_date(?, 'dd/mm/yyyy'),?,?,?,?,?,?);";

        try {
            s = conexion.session.prepareStatement(query);
            s.setString(1, art.getNombrePuesto());
            s.setString(2, art.getNombre_cargo());
            s.setString(3, art.getSede());
            s.setString(4, art.getRealizadoPor());
            s.setString(5, art.getFechaArt());
            s.setString(6, art.getFechaModificacion());
            s.setString(7, art.getDescripcion());
            s.setString(8, factoresRiesgo);
            s.setString(9, art.getActividades());
            s.setString(10, art.getObservaciones());
            s.setString(11, art.getSustanciasMaterialesEncontrados());
            s.setString(12, art.getEquipoRequerido());
            s.executeUpdate();

            query = "SELECT MAX(id_art) from art";
            s = conexion.session.prepareStatement(query);
            ResultSet rs = s.executeQuery();

            if (!rs.next()) {
                return rollbackInsert(conexion, s);
            }
            int idART = rs.getInt(1);
            rs.close();

            query = "SELECT * from puesto_trabajo where nombre_puesto=? and nombre_cargo=? and sede=?";
            s = conexion.session.prepareStatement(query);
            s.setString(1, art.getNombrePuesto());
            s.setString(2, art.getNombre_cargo());
            s.setString(3, art.getSede());
            rs = s.executeQuery();
            if (!rs.next()) {
                return rollbackInsert(conexion, s);
            }

            String sede = rs.getString("sede");
            String espacio = rs.getString("espacio");
            rs.close();

            String[] coordenas = art.getCoordenadas();
            String ubicacionART = "";
            System.out.println("\n\n\n\n************** UBICACION RIESGOS *****************\n\n\n\n\n");
            String ubicacionRiesgo = null;
            for (int i = 0; i < riesgos.length; i++) {
                ubicacionRiesgo = "INSERT INTO ubicacion_riesgo(id_art,riesgo,sede,espacio, coordenadas) VALUES (" + idART + ",'" + riesgos[i] + "','" + sede + "','" + espacio + "','" + coordenas[i] + "');";
                ubicacionART += ubicacionRiesgo;
                System.out.println(ubicacionRiesgo);
            }
            s = conexion.session.prepareStatement(ubicacionART);
            s.executeUpdate();
            s = conexion.session.prepareStatement("COMMIT;");
            s.executeUpdate();
            return true;
        } catch (SQLException se) {
            rollbackInsert(conexion, s);
            System.out.println("Error Insertando ART! " + se.getMessage());
            return false;
        }
    }

    private static boolean rollbackInsert(ConexionBD conexion, PreparedStatement s) {
        try {
            System.out.println("Error Insertando ART!");
            s = conexion.session.prepareStatement("ROLLBACK;");
            s.executeUpdate();
            conexion.cerrarConexion();
        } catch (SQLException ex) {
            System.out.println("Error en Transaccion! " + ex.getMessage());
        }
        return false;
    }

    public static JSONObject listarArt(Art art, String limit, String offset, String order, String asc) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        JSONObject arts = new JSONObject();
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("¡Error Consultando AST!");
            return null;
        }
        try {
            String query = "SELECT id_art, nombre_puesto, nombre_cargo, sede, realizado_por, to_char(fecha_art,'DD-MM-YYYY'), to_char(fecha_modificacion,'DD-MM-YYYY') from art ";
            String params = "WHERE (1=1) ";

            if (art.getNombre_cargo() != null && !art.getNombre_cargo().equals("")) {
                params += "and nombre_cargo = '" + art.getNombre_cargo() + "' ";
            }
            if (art.getNombrePuesto() != null && !art.getNombrePuesto().equals("")) {
                params += "and nombre_puesto = '" + art.getNombrePuesto() + "' ";
            }
            if (art.getRealizadoPor() != null && !art.getRealizadoPor().equals("")) {
                params += "and lower(realizado_por) LIKE '%" + art.getRealizadoPor().toLowerCase() + "%' ";
            }
            if (art.getFechaArt() != null && !art.getFechaArt().equals("")) {
                params += "and fechaArt = '" + art.getFechaArt() + "' ";
            }

            String format = "";
            if (order != null && !order.equals("")) {
                format += " order by " + order;
                if (asc != null && !asc.equals("") && asc.equals("false")) {
                    format += " desc";
                } else {
                    format += " asc";
                }
            }

            if (limit != null && !limit.equals("")) {
                format += " limit " + limit;
            }
            if (offset != null && !offset.equals("")) {
                format += " offset " + offset;
            }
            System.out.println(query + params + format);
            rs = s.executeQuery(query + params + format);
            JSONArray ja = new JSONArray();

            int i = 0;
            while (rs.next()) {
                JSONObject jo = new JSONObject();
                jo.put("idArt", rs.getString(1));
                jo.put("nombrePuesto", rs.getString(2));
                jo.put("nombreCargo", rs.getString(3));
                jo.put("sede", rs.getString(4));
                jo.put("realizadoPor", rs.getString(5));
                jo.put("fechaArt", rs.getString(6));
                jo.put("fechaModificacion", rs.getString(7));
                ja.put(i++, jo);
            }
            query = "select count(*) from art a " + params;
            rs = s.executeQuery(query);
            arts.put("arts", ja);
            if (rs.next()) {
                arts.put("tam", rs.getString(1));
            }
            return arts;
        } catch (SQLException se) {
            System.out.println("Error Consultado el ART\n" + se.getMessage());
            return null;
        } catch (Exception e) {
            System.out.println("Error obteniendo data del ART\n" + e.getMessage());
            return null;
        }
    }

    public static JSONObject consultarART(String idArt) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        JSONObject art = new JSONObject();
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando los ART!");
            return null;
        }
        try {
            String query = "SELECT * from art WHERE (id_art=" + idArt + ")";
            System.out.println("\n\n\n\n" + query);
            rs = s.executeQuery(query);
            JSONObject jo = new JSONObject();
            if (rs.next()) {
                jo.put("id_art", rs.getString(1));
                jo.put("nombrePuesto", rs.getString(2));
                jo.put("nombreCargo", rs.getString(3));
                jo.put("sede", rs.getString(4));
                jo.put("realizadoPor", rs.getString(5));
                jo.put("fechaArt", rs.getString(6));
                jo.put("fechaModificacion", rs.getString((7)));
                jo.put("descripcion", rs.getString(8));
                jo.put("factoresRiesgo", rs.getString(9));
                jo.put("actividades", rs.getString(10));
                jo.put("observaciones", rs.getString(11));
                jo.put("sustanciasMateriales", rs.getString(12));
                jo.put("equipoRequerido", rs.getString(13));
            }
            art.put("art", jo);

            query = "SELECT riesgo, coordenadas from ubicacion_riesgo WHERE (id_art=" + idArt + ")";
            System.out.println("\n\n\n\n" + query);
            rs = s.executeQuery(query);
            JSONArray riesgos = new JSONArray();
            int i = 0;
            while (rs.next()) {
                jo = new JSONObject();
                jo.put("riesgo", rs.getString(1));
                jo.put("coordenadas", rs.getString(2));

                riesgos.put(i++, jo);
            }
            art.put("riesgos", riesgos);
            return art;
        } catch (SQLException se) {
            System.out.println("Error Consultado el ART" + se.getMessage());
            return null;
        } catch (Exception e) {
            System.out.println("Error obteniendo data del ART." + e.getMessage());
            return null;
        }
    }

    public static boolean actualizarArt(Art e) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error actualizando un ART!");
            return false;
        }
        String query = "UPDATE art set ";

        query += "nombre_puesto = '" + e.getNombrePuesto() + "' ";
        query += ",realizado_por='" + e.getRealizadoPor() + "'  ";
        query += ",fecha_art ='" + e.getFechaArt() + "',";
        query += " fecha_modificacion = current_date ";
        query += ",factores_riesgo='" + e.getFactoresRiesgo() + "' ";
        query += ",descripcion ='" + e.getDescripcion() + "' ";
        query += ",actividades='" + e.getActividades() + "' ";
        query += ",observaciones='" + e.getObservaciones() + "' ";
        query += ",sustancias_materiales_encontrados='" + e.getSustanciasMaterialesEncontrados() + "' ";
        query += ",equipo_requerido='" + e.getEquipoRequerido() + "' ";
        query += " where id_art = " + e.getArt() + ";";

        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error al actualizar el ART" + se.getMessage());
            return false;
        }
    }

    public byte[] generarInforme(Map parametros) {
        ConexionBD conexion = new ConexionBD();
        byte[] pdf = null;
        String filename = "/Modulo3/informeART.jasper";
        JasperReport masterReport = null;
        try {
            masterReport = (JasperReport) JRLoader.loadObject(getClass().getResource(filename));
            pdf = JasperRunManager.runReportToPdf(masterReport, parametros, conexion.session);
        } catch (JRException e) {
        }
        if (conexion.session != null) {
            conexion.cerrarConexion();
        }

        return pdf;
    }
}